<?php
// L3 MIAGE Nice - Gestion de projets et Analyse des besoins - 2010-2011
// Création d'un site internet de vente de vidéos en ligne
// 
// class_dbfactory.php - classe abstraite pour la connexion à un SGBD
//   Design pattern Factory (classe mère)
//   Permet à l'application de se connecter à un SGBD dont on a défini la classe
// 
// Auteur : (groupe 15) Shyn-Yuan CHENG, Abdoul Mazid DIALLO, LAGNEAU Sébastien, NJOTCHA-NJOTCHA Franck-Merlin
//

abstract class dbfactory {

   private static $instance; // Instance courante de la classe

   protected $_config; // Paramètres de configuration base de donnée.
   protected $query; // Ressource de résultat de la requête


   // Initialise les variables de connections et active la connection à la base de donnée.
   // Constructeur protégé permettant de n'avoir qu'une unique instance de la classe grâce à la méthode singleton
   //
   protected function __construct ($host=NULL, $user=NULL, $passwd=NULL, $name=NULL) {
      if (!is_array($this->default_cfg)) {
         throw new Exception('Les paramètres de la configuration à la base de donnée ne sont pas définis');
      }

      foreach ($this->default_cfg as $key=>$val ) {
         $this->_config[$key] = (isset($$key) ) ? $$key : $val;
      }

      unset($this->default_cfg); // Enlève les paramètres par defaut pour éviter toute confusion possible.
      $this->connect();
   }

   // Usinage : permet d'instancier la classe correcte en fonction de la db choisie
   //
   public static function factory ($type, $host=NULL, $user=NULL, $passwd=NULL, $name=NULL) {
      if (class_exists ($type)) {
         $className = $type;
         return new $className ($host, $user, $passwd, $name);
      } else {
         throw new Exception ('Pas d\'implémentation disponible pour ' . $type);
      }
   }

   // N'autorise qu'une seule instance de la classe
   //
   public static function singleton () {
      if (!isset(self::$instance)) {
         $c = __CLASS__;
         self::$instance = new $c;
      }
      return self::$instance;
   }

   // On avertit le développeur qu'il n'a pas le droit de cloner l'objet instancié
   //
   public function __clone() { trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR); }

   // Méthodes abstraites
   //
   abstract protected function connect();
   abstract public function __destruct();
   abstract public function query($sql);
   abstract public function fetch_object();
   abstract public function num_rows();
   abstract public function free();
}

?>
